#!/usr/bin/env python
# PYTHON_ARGCOMPLETE_OK

# Copyright 2012-2013, Andrey Kislyuk and argcomplete contributors.
# Licensed under the Apache License. See https://github.com/kislyuk/argcomplete for more info.

'''
Register a Python executable for use with the argcomplete module.

To perform the registration, source the output of this script in your bash shell (quote the output to avoid interpolation).

Example:

    $ eval "$(register-python-argcomplete my-favorite-script.py)"
'''

import os, sys, argparse

shellcode = '''
_python_argcomplete() {
    local IFS='\013'
    COMPREPLY=( $(IFS="$IFS" \
                  COMP_LINE="$COMP_LINE" \
                  COMP_POINT="$COMP_POINT" \
                  _ARGCOMPLETE_COMP_WORDBREAKS="$COMP_WORDBREAKS" \
                  _ARGCOMPLETE=1 \
                  "$1" 8>&1 9>&2 1>/dev/null 2>/dev/null) )
    if [[ $? != 0 ]]; then
        unset COMPREPLY
    fi
}
complete %(complete_opts)s -F _python_argcomplete "%(executable)s"
'''

parser = argparse.ArgumentParser(
    description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)

parser.add_argument('--no-defaults',
    dest='use_defaults', action='store_false', default=True,
    help='When no matches are generated, do not fallback to readline\'s default completion')
parser.add_argument('--complete-arguments', nargs=argparse.REMAINDER,
    help='arguments to call complete with; use of this option discards default options')

parser.add_argument("executable")

if len(sys.argv)==1:
    parser.print_help()
    sys.exit(1)

args = parser.parse_args()

if args.complete_arguments is None:
    complete_options = '-o nospace -o default' if args.use_defaults else '-o nospace'
else:
    complete_options = " ".join(args.complete_arguments)

sys.stdout.write(shellcode % dict(
    complete_opts = complete_options,
    executable = args.executable
))
